{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Object Detection with Street View House Numbers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook illustrates how to build a deep CNN using Keras’ functional API to generate multiple outputs: one to predict how many digits are present, and five for the value of each in the order they appear."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports & Settings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.265015Z",
     "start_time": "2020-06-21T22:47:31.731901Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from pathlib import Path\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.applications.vgg16 import VGG16\n",
    "from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "from tensorflow.keras.layers import (Flatten,\n",
    "                                     Dense,\n",
    "                                     BatchNormalization,\n",
    "                                     Activation,\n",
    "                                     Concatenate)\n",
    "from tensorflow.keras import backend as K\n",
    "from matplotlib.ticker import FuncFormatter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.293300Z",
     "start_time": "2020-06-21T22:47:33.266480Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using GPU\n"
     ]
    }
   ],
   "source": [
    "gpu_devices = tf.config.experimental.list_physical_devices('GPU')\n",
    "if gpu_devices:\n",
    "    print('Using GPU')\n",
    "    tf.config.experimental.set_memory_growth(gpu_devices[0], True)\n",
    "else:\n",
    "    print('Using CPU')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.303179Z",
     "start_time": "2020-06-21T22:47:33.294737Z"
    }
   },
   "outputs": [],
   "source": [
    "sns.set_style('whitegrid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.311925Z",
     "start_time": "2020-06-21T22:47:33.304720Z"
    }
   },
   "outputs": [],
   "source": [
    "data_path = Path('images', 'svhn')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.321737Z",
     "start_time": "2020-06-21T22:47:33.313249Z"
    }
   },
   "outputs": [],
   "source": [
    "results_path = Path('results', 'svhn')\n",
    "if not results_path.exists():\n",
    "    results_path.mkdir()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Settings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.329124Z",
     "start_time": "2020-06-21T22:47:33.323269Z"
    }
   },
   "outputs": [],
   "source": [
    "IMG_SIZE = 32\n",
    "IMG_SHAPE = (IMG_SIZE, IMG_SIZE, 3)\n",
    "SEQ_LENGTH = 4\n",
    "N_CLASSES = 11"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Data "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.421046Z",
     "start_time": "2020-06-21T22:47:33.331060Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train = np.load(data_path / 'X_train.npy')\n",
    "y_train = np.load(data_path / 'y_train.npy')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Removing the rare cases of 5-digit house numbers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.499427Z",
     "start_time": "2020-06-21T22:47:33.422656Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train = X_train[y_train[:, 0] < 5]\n",
    "y_train = y_train[y_train[:, 0] < 5, :5]\n",
    "y_train[:, 0] -= 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.539675Z",
     "start_time": "2020-06-21T22:47:33.502174Z"
    }
   },
   "outputs": [],
   "source": [
    "X_test = np.load(data_path / 'X_test.npy')\n",
    "y_test = np.load(data_path / 'y_test.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.571516Z",
     "start_time": "2020-06-21T22:47:33.540841Z"
    }
   },
   "outputs": [],
   "source": [
    "X_test = X_test[y_test[:, 0] < 5]\n",
    "y_test = y_test[y_test[:, 0] < 5, :5]\n",
    "y_test[:, 0] -= 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.581705Z",
     "start_time": "2020-06-21T22:47:33.572843Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     4\n",
       "1    10\n",
       "2    11\n",
       "3    11\n",
       "4    11\n",
       "dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(y_train).nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.586550Z",
     "start_time": "2020-06-21T22:47:33.583453Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(33392, 5)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Best Architecture"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Multi-digit Number Recognition from Street View Imagery using Deep Convolutional Neural Networks](https://arxiv.org/abs/1312.6082), Goodfellow, et al, 2014"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.593612Z",
     "start_time": "2020-06-21T22:47:33.587628Z"
    }
   },
   "outputs": [],
   "source": [
    "digit_pos = {1: [4, 14], 2: [14, 25], 3: [25, 36], 4: [36, 47]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.602882Z",
     "start_time": "2020-06-21T22:47:33.594860Z"
    }
   },
   "outputs": [],
   "source": [
    "def weighted_accuracy(y_true, y_pred):\n",
    "    n_digits_pred = K.argmax(y_pred[:, :SEQ_LENGTH], axis=1)\n",
    "\n",
    "    digit_preds = {}\n",
    "    for digit, (start, end) in digit_pos.items():\n",
    "        digit_preds[digit] = K.argmax(y_pred[:, start:end], axis=1)\n",
    "    preds = tf.dtypes.cast(tf.stack((n_digits_pred,\n",
    "                                     digit_preds[1],\n",
    "                                     digit_preds[2],\n",
    "                                     digit_preds[3],\n",
    "                                     digit_preds[4]), axis=1), tf.float32)\n",
    "\n",
    "    return K.mean(K.sum(tf.dtypes.cast(K.equal(y_true, preds), tf.int64), axis=1) / 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:33.614552Z",
     "start_time": "2020-06-21T22:47:33.604375Z"
    }
   },
   "outputs": [],
   "source": [
    "def weighted_entropy(y_true, y_pred):\n",
    "    cce = tf.keras.losses.SparseCategoricalCrossentropy()\n",
    "    n_digits = y_pred[:, :SEQ_LENGTH]\n",
    "\n",
    "    digits = {}\n",
    "    for digit, (start, end) in digit_pos.items():\n",
    "        digits[digit] = y_pred[:, start:end]\n",
    "    return (cce(y_true[:, 0], n_digits) +\n",
    "            cce(y_true[:, 1], digits[1]) +\n",
    "            cce(y_true[:, 2], digits[2]) +\n",
    "            cce(y_true[:, 3], digits[3]) +\n",
    "            cce(y_true[:, 4], digits[4])) / 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:34.551253Z",
     "start_time": "2020-06-21T22:47:33.616023Z"
    }
   },
   "outputs": [],
   "source": [
    "vgg16 = VGG16(input_shape=IMG_SHAPE, include_top=False, weights='imagenet')\n",
    "vgg16.trainable = False\n",
    "x = vgg16.output\n",
    "x = Flatten()(x)\n",
    "x = BatchNormalization()(x)\n",
    "x = Dense(256)(x)\n",
    "x = BatchNormalization()(x)\n",
    "x = Activation('relu')(x)\n",
    "x = Dense(128)(x)\n",
    "x = BatchNormalization()(x)\n",
    "x = Activation('relu')(x)\n",
    "n_digits = Dense(SEQ_LENGTH, activation='softmax', name='n_digits')(x)\n",
    "digit1 = Dense(N_CLASSES-1, activation='softmax', name='d1')(x)\n",
    "digit2 = Dense(N_CLASSES, activation='softmax', name='d2')(x)\n",
    "digit3 = Dense(N_CLASSES, activation='softmax', name='d3')(x)\n",
    "digit4 = Dense(N_CLASSES, activation='softmax', name='d4')(x)\n",
    "predictions = Concatenate()([n_digits, digit1, digit2, digit3, digit4])\n",
    "\n",
    "model = Model(inputs=vgg16.input, outputs=predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:34.562923Z",
     "start_time": "2020-06-21T22:47:34.552629Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer='adam',\n",
    "              loss=weighted_entropy,\n",
    "              metrics=[weighted_accuracy])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a result, the model produces five distinct outputs that we can evaluate."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define Callbacks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:34.578201Z",
     "start_time": "2020-06-21T22:47:34.564583Z"
    }
   },
   "outputs": [],
   "source": [
    "svhn_path = (results_path / 'svhn.weights.best.hdf5').as_posix()\n",
    "checkpointer = ModelCheckpoint(filepath=svhn_path, \n",
    "                               verbose=1, \n",
    "                               monitor='val_weighted_accuracy',\n",
    "                               save_best_only=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:34.589806Z",
     "start_time": "2020-06-21T22:47:34.579325Z"
    }
   },
   "outputs": [],
   "source": [
    "early_stopping = EarlyStopping(monitor='val_weighted_accuracy', \n",
    "                               patience=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train Transfer Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:47:34.597557Z",
     "start_time": "2020-06-21T22:47:34.590823Z"
    }
   },
   "outputs": [],
   "source": [
    "epochs = 50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:40.715789Z",
     "start_time": "2020-06-21T22:47:34.598687Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "940/940 [==============================] - ETA: 0s - loss: 1.0570 - weighted_accuracy: 0.6429\n",
      "Epoch 00001: val_weighted_accuracy improved from -inf to 0.67796, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 1.0570 - weighted_accuracy: 0.6429 - val_loss: 0.9570 - val_weighted_accuracy: 0.6780\n",
      "Epoch 2/50\n",
      "939/940 [============================>.] - ETA: 0s - loss: 0.9246 - weighted_accuracy: 0.6835\n",
      "Epoch 00002: val_weighted_accuracy improved from 0.67796 to 0.68603, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.9247 - weighted_accuracy: 0.6834 - val_loss: 0.9284 - val_weighted_accuracy: 0.6860\n",
      "Epoch 3/50\n",
      "937/940 [============================>.] - ETA: 0s - loss: 0.8844 - weighted_accuracy: 0.6978\n",
      "Epoch 00003: val_weighted_accuracy improved from 0.68603 to 0.69097, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.8843 - weighted_accuracy: 0.6979 - val_loss: 0.9175 - val_weighted_accuracy: 0.6910\n",
      "Epoch 4/50\n",
      "939/940 [============================>.] - ETA: 0s - loss: 0.8490 - weighted_accuracy: 0.7088\n",
      "Epoch 00004: val_weighted_accuracy improved from 0.69097 to 0.69671, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.8490 - weighted_accuracy: 0.7088 - val_loss: 0.9014 - val_weighted_accuracy: 0.6967\n",
      "Epoch 5/50\n",
      "936/940 [============================>.] - ETA: 0s - loss: 0.8199 - weighted_accuracy: 0.7196\n",
      "Epoch 00005: val_weighted_accuracy improved from 0.69671 to 0.69742, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.8200 - weighted_accuracy: 0.7194 - val_loss: 0.9036 - val_weighted_accuracy: 0.6974\n",
      "Epoch 6/50\n",
      "935/940 [============================>.] - ETA: 0s - loss: 0.7952 - weighted_accuracy: 0.7266\n",
      "Epoch 00006: val_weighted_accuracy improved from 0.69742 to 0.69829, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.7952 - weighted_accuracy: 0.7266 - val_loss: 0.9069 - val_weighted_accuracy: 0.6983\n",
      "Epoch 7/50\n",
      "935/940 [============================>.] - ETA: 0s - loss: 0.7745 - weighted_accuracy: 0.7347\n",
      "Epoch 00007: val_weighted_accuracy improved from 0.69829 to 0.70073, saving model to results/svhn/cnn.weights.best.hdf5\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.7745 - weighted_accuracy: 0.7347 - val_loss: 0.9127 - val_weighted_accuracy: 0.7007\n",
      "Epoch 8/50\n",
      "937/940 [============================>.] - ETA: 0s - loss: 0.7568 - weighted_accuracy: 0.7397\n",
      "Epoch 00008: val_weighted_accuracy did not improve from 0.70073\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.7569 - weighted_accuracy: 0.7396 - val_loss: 0.9234 - val_weighted_accuracy: 0.6983\n",
      "Epoch 9/50\n",
      "939/940 [============================>.] - ETA: 0s - loss: 0.7378 - weighted_accuracy: 0.7452\n",
      "Epoch 00009: val_weighted_accuracy did not improve from 0.70073\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.7379 - weighted_accuracy: 0.7450 - val_loss: 0.9311 - val_weighted_accuracy: 0.6971\n",
      "Epoch 10/50\n",
      "938/940 [============================>.] - ETA: 0s - loss: 0.7192 - weighted_accuracy: 0.7521\n",
      "Epoch 00010: val_weighted_accuracy did not improve from 0.70073\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.7193 - weighted_accuracy: 0.7520 - val_loss: 0.9380 - val_weighted_accuracy: 0.6958\n",
      "Epoch 11/50\n",
      "937/940 [============================>.] - ETA: 0s - loss: 0.7066 - weighted_accuracy: 0.7557\n",
      "Epoch 00011: val_weighted_accuracy did not improve from 0.70073\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.7070 - weighted_accuracy: 0.7554 - val_loss: 0.9588 - val_weighted_accuracy: 0.6966\n",
      "Epoch 12/50\n",
      "937/940 [============================>.] - ETA: 0s - loss: 0.6923 - weighted_accuracy: 0.7615\n",
      "Epoch 00012: val_weighted_accuracy did not improve from 0.70073\n",
      "940/940 [==============================] - 10s 11ms/step - loss: 0.6925 - weighted_accuracy: 0.7612 - val_loss: 0.9697 - val_weighted_accuracy: 0.6980\n"
     ]
    }
   ],
   "source": [
    "result = model.fit(x=X_train,\n",
    "                    y=y_train,\n",
    "                    validation_split=.1,\n",
    "                    batch_size=32,\n",
    "                    epochs=epochs,\n",
    "                    verbose=1,\n",
    "                    callbacks=[checkpointer, early_stopping])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluate Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:40.721759Z",
     "start_time": "2020-06-21T22:49:40.718448Z"
    }
   },
   "outputs": [],
   "source": [
    "metrics = pd.DataFrame(result.history)\n",
    "initial_epochs = len(metrics)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.797793Z",
     "start_time": "2020-06-21T22:49:40.723438Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "409/409 [==============================] - 3s 7ms/step\n"
     ]
    }
   ],
   "source": [
    "y_pred = model.predict(X_test, verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.801856Z",
     "start_time": "2020-06-21T22:49:43.799234Z"
    }
   },
   "outputs": [],
   "source": [
    "n_digits = y_pred[:, :SEQ_LENGTH]\n",
    "digits = {}\n",
    "for digit, (start, end) in digit_pos.items():\n",
    "    digits[digit] = y_pred[:, start:end]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.811605Z",
     "start_time": "2020-06-21T22:49:43.803140Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.829710699525486"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(y_test[:, 0] == np.argmax(n_digits, axis=1)).sum()/len(n_digits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.838265Z",
     "start_time": "2020-06-21T22:49:43.820295Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1907,  559,   16,    1],\n",
       "       [ 347, 7257,  739,   13],\n",
       "       [  12,  357, 1606,  106],\n",
       "       [   0,    3,   72,   71]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "confusion_matrix(y_true=y_test[:, 0], y_pred=np.argmax(n_digits, axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.847640Z",
     "start_time": "2020-06-21T22:49:43.839615Z"
    }
   },
   "outputs": [],
   "source": [
    "accuracy = np.zeros_like(y_test)\n",
    "accuracy[:, 0] = (y_test[:, 0] == np.argmax(n_digits, axis=1))\n",
    "for i in range(1, 5):\n",
    "    accuracy[:, i] = (y_test[:, i] == np.argmax(digits[i], axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.853626Z",
     "start_time": "2020-06-21T22:49:43.849114Z"
    }
   },
   "outputs": [],
   "source": [
    "acc_by_output = {}\n",
    "for i in range(5):\n",
    "    acc_by_output[i] = accuracy[:, i].sum()/accuracy[:, i].shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:43.864051Z",
     "start_time": "2020-06-21T22:49:43.855092Z"
    }
   },
   "outputs": [],
   "source": [
    "acc_up_to_out = {}\n",
    "for i in range(1, 6):\n",
    "    r = accuracy[:, :i].all(1)\n",
    "    acc_up_to_out[i-1] = r.sum()/r.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:44.063802Z",
     "start_time": "2020-06-21T22:49:43.865700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.DataFrame({'acc1': acc_by_output, 'acc2': acc_up_to_out}).plot.bar()\n",
    "sns.despine();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fine Tune VGG16 weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:44.069035Z",
     "start_time": "2020-06-21T22:49:44.065240Z"
    }
   },
   "outputs": [],
   "source": [
    "vgg16.trainable = True\n",
    "# Fine-tune from this layer onwards\n",
    "start_fine_tuning_at = 1\n",
    "\n",
    "# Freeze all the layers before the `fine_tune_at` layer\n",
    "for layer in vgg16.layers[:start_fine_tuning_at]:\n",
    "    layer.trainable =  False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:44.087667Z",
     "start_time": "2020-06-21T22:49:44.070675Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer='adam',\n",
    "              loss=weighted_entropy,\n",
    "              metrics=[weighted_accuracy])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T22:49:44.091960Z",
     "start_time": "2020-06-21T22:49:44.089229Z"
    }
   },
   "outputs": [],
   "source": [
    "fine_tune_epochs = 50\n",
    "total_epochs = initial_epochs + fine_tune_epochs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T23:05:19.660423Z",
     "start_time": "2020-06-21T22:49:44.094043Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 12/62\n",
      "940/940 [==============================] - 28s 30ms/step - loss: 1.1122 - weighted_accuracy: 0.6255 - val_loss: 1.4838 - val_weighted_accuracy: 0.5645\n",
      "Epoch 13/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.7990 - weighted_accuracy: 0.7213 - val_loss: 0.7274 - val_weighted_accuracy: 0.7598\n",
      "Epoch 14/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.5737 - weighted_accuracy: 0.8069 - val_loss: 0.6773 - val_weighted_accuracy: 0.8038\n",
      "Epoch 15/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.4478 - weighted_accuracy: 0.8533 - val_loss: 0.5126 - val_weighted_accuracy: 0.8332\n",
      "Epoch 16/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.3589 - weighted_accuracy: 0.8841 - val_loss: 0.3812 - val_weighted_accuracy: 0.8817\n",
      "Epoch 17/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.3012 - weighted_accuracy: 0.9045 - val_loss: 0.5555 - val_weighted_accuracy: 0.8590\n",
      "Epoch 18/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.2549 - weighted_accuracy: 0.9193 - val_loss: 0.3523 - val_weighted_accuracy: 0.8995\n",
      "Epoch 19/62\n",
      "940/940 [==============================] - 28s 30ms/step - loss: 0.3463 - weighted_accuracy: 0.8900 - val_loss: 4.3139 - val_weighted_accuracy: 0.4720\n",
      "Epoch 20/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.2846 - weighted_accuracy: 0.9100 - val_loss: 0.3679 - val_weighted_accuracy: 0.8956\n",
      "Epoch 21/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.1913 - weighted_accuracy: 0.9411 - val_loss: 0.2391 - val_weighted_accuracy: 0.9345\n",
      "Epoch 22/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.1625 - weighted_accuracy: 0.9497 - val_loss: 0.2586 - val_weighted_accuracy: 0.9305\n",
      "Epoch 23/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.1505 - weighted_accuracy: 0.9532 - val_loss: 0.2329 - val_weighted_accuracy: 0.9360\n",
      "Epoch 24/62\n",
      "940/940 [==============================] - 28s 30ms/step - loss: 0.1301 - weighted_accuracy: 0.9591 - val_loss: 0.3306 - val_weighted_accuracy: 0.9168\n",
      "Epoch 25/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.1247 - weighted_accuracy: 0.9609 - val_loss: 0.2463 - val_weighted_accuracy: 0.9360\n",
      "Epoch 26/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.1177 - weighted_accuracy: 0.9629 - val_loss: 0.2444 - val_weighted_accuracy: 0.9374\n",
      "Epoch 27/62\n",
      "940/940 [==============================] - 28s 30ms/step - loss: 0.1076 - weighted_accuracy: 0.9660 - val_loss: 0.2647 - val_weighted_accuracy: 0.9308\n",
      "Epoch 28/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0974 - weighted_accuracy: 0.9691 - val_loss: 0.2547 - val_weighted_accuracy: 0.9346\n",
      "Epoch 29/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.0928 - weighted_accuracy: 0.9710 - val_loss: 0.2480 - val_weighted_accuracy: 0.9382\n",
      "Epoch 30/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0844 - weighted_accuracy: 0.9733 - val_loss: 0.2474 - val_weighted_accuracy: 0.9392\n",
      "Epoch 31/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0791 - weighted_accuracy: 0.9750 - val_loss: 0.2747 - val_weighted_accuracy: 0.9322\n",
      "Epoch 32/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.0727 - weighted_accuracy: 0.9767 - val_loss: 0.2443 - val_weighted_accuracy: 0.9415\n",
      "Epoch 33/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0697 - weighted_accuracy: 0.9777 - val_loss: 0.3545 - val_weighted_accuracy: 0.9268\n",
      "Epoch 34/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0672 - weighted_accuracy: 0.9786 - val_loss: 0.2289 - val_weighted_accuracy: 0.9473\n",
      "Epoch 35/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.0666 - weighted_accuracy: 0.9792 - val_loss: 0.2312 - val_weighted_accuracy: 0.9500\n",
      "Epoch 36/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0538 - weighted_accuracy: 0.9827 - val_loss: 0.2671 - val_weighted_accuracy: 0.9453\n",
      "Epoch 37/62\n",
      "940/940 [==============================] - 28s 30ms/step - loss: 0.0544 - weighted_accuracy: 0.9824 - val_loss: 0.2291 - val_weighted_accuracy: 0.9481\n",
      "Epoch 38/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0641 - weighted_accuracy: 0.9801 - val_loss: 0.2299 - val_weighted_accuracy: 0.9500\n",
      "Epoch 39/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0427 - weighted_accuracy: 0.9868 - val_loss: 0.2624 - val_weighted_accuracy: 0.9452\n",
      "Epoch 40/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.0445 - weighted_accuracy: 0.9859 - val_loss: 0.2670 - val_weighted_accuracy: 0.9512\n",
      "Epoch 41/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0458 - weighted_accuracy: 0.9854 - val_loss: 0.2708 - val_weighted_accuracy: 0.9504\n",
      "Epoch 42/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0413 - weighted_accuracy: 0.9869 - val_loss: 0.2706 - val_weighted_accuracy: 0.9498\n",
      "Epoch 43/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0421 - weighted_accuracy: 0.9869 - val_loss: 0.2810 - val_weighted_accuracy: 0.9481\n",
      "Epoch 44/62\n",
      "940/940 [==============================] - 27s 29ms/step - loss: 0.0385 - weighted_accuracy: 0.9876 - val_loss: 0.3396 - val_weighted_accuracy: 0.9430\n",
      "Epoch 45/62\n",
      "940/940 [==============================] - 28s 29ms/step - loss: 0.0410 - weighted_accuracy: 0.9871 - val_loss: 0.2367 - val_weighted_accuracy: 0.9486\n"
     ]
    }
   ],
   "source": [
    "result_fine_tune = model.fit(x=X_train,\n",
    "                              y=y_train,\n",
    "                              validation_split=.1,\n",
    "                              batch_size=32,\n",
    "                              epochs=total_epochs,\n",
    "                              initial_epoch=history.epoch[-1],\n",
    "                              callbacks=[early_stopping])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T23:05:19.678196Z",
     "start_time": "2020-06-21T23:05:19.661874Z"
    }
   },
   "outputs": [],
   "source": [
    "metrics_tuned = metrics.append(pd.DataFrame(result_fine_tune.history), ignore_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T23:05:19.691349Z",
     "start_time": "2020-06-21T23:05:19.679670Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 46 entries, 0 to 45\n",
      "Data columns (total 4 columns):\n",
      " #   Column                 Non-Null Count  Dtype  \n",
      "---  ------                 --------------  -----  \n",
      " 0   loss                   46 non-null     float64\n",
      " 1   weighted_accuracy      46 non-null     float64\n",
      " 2   val_loss               46 non-null     float64\n",
      " 3   val_weighted_accuracy  46 non-null     float64\n",
      "dtypes: float64(4)\n",
      "memory usage: 1.6 KB\n"
     ]
    }
   ],
   "source": [
    "metrics_tuned.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T23:05:20.290854Z",
     "start_time": "2020-06-21T23:05:19.692446Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(ncols=2, figsize=(15, 4))\n",
    "metrics_tuned[['loss', 'val_loss']].plot(ax=axes[1], title='Cross-Entropy Loss')\n",
    "metrics_tuned[['weighted_accuracy', 'val_weighted_accuracy']].plot(ax=axes[0], title=f'Accuracy (Best: {metrics_tuned.val_weighted_accuracy.max():.2%})')\n",
    "axes[0].yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y)))\n",
    "axes[0].set_ylabel('Accuracy')\n",
    "axes[1].set_ylabel('Loss')\n",
    "for ax in axes:\n",
    "    ax.axvline(14, ls='--', lw=1, c='k')\n",
    "    ax.legend(['Training', 'Validation', 'Start Fine Tuning'])\n",
    "    ax.set_xlabel('Epoch')\n",
    "fig.tight_layout()\n",
    "fig.savefig(results_path / 'transfer_learning_svhn');"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:ml4t-dl]",
   "language": "python",
   "name": "conda-env-ml4t-dl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "380px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
